package main

import "fmt"

func main() {
	// Go语言空接口类型
	// 空接口类型可以保存任何值，也可以从空接口中取出原值
	var any interface{}
	any = 1
	fmt.Println(any)
	any = "hello"
	fmt.Println(any)
	something, ok := any.(string)
	fmt.Println(something, ok)

	// 类型不同的空接口间的比较结果不相同
	var a interface{} = 100
	var b interface{} = "hi"
	fmt.Println(a == b)

	// 不能比较空接口中的动态值:触发运行时恐慌
	var c interface{} = []int{10}
	var d interface{} = []int{20}
	fmt.Println(c == d)
}
// 空值接口的比较规则
// | 类型          | 可比较性   | 说明                                                    |
// | ----------- | ------ | ----------------------------------------------------- |
// | `map`       | ❌ 不可比较 | 仅能与 `nil` 比较；`==` 操作会 **宕机**                          |
// | `切片 []T`    | ❌ 不可比较 | 仅能与 `nil` 比较；`==` 操作会 **宕机**                          |
// | `通道 chan T` | ✅ 可比较  | 必须由 **同一个 `make`** 创建才相等，否则为 `false`                  |
// | `数组 [N]T`   | ✅ 可比较  | 元素类型可比较时即可比较；长度、元素逐个对比                                |
// | `结构体`       | ✅ 可比较  | 字段逐个比较；所有字段类型必须可比较                                    |
// | `函数`        | ✅ 可比较  | 仅与 `nil` 比较有意义；非 `nil` 函数值相等条件是 **指向同一机器码入口**（实际用途极少） |
